home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / vogle / prev.lha / repeat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-07  |  2.0 KB  |  107 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "art.h"
  4. #include "objs.h"
  5. #include "macro.h"
  6. #include "gram.h"
  7.  
  8. extern hlist    *fhlist;
  9.  
  10. extern object    *objectinit(), *csginit();
  11. extern object    *oblist;
  12.  
  13. extern attr    *astackp;
  14. extern mats    *mstackp;
  15.  
  16. /*
  17.  * dorepeat
  18.  *
  19.  *    execute the body of a repeat loop.
  20.  */
  21. dorepeat(expr, stmts)
  22.     expression    *expr;
  23.     details        *stmts;
  24. {
  25.     int        i, count;
  26.     details        *d, *nxtd, *head;
  27.     details        *dl, *shead, *stail, *newstmnt;
  28.     expression    *nexpr;
  29.     object        *obj, *ohead;
  30.  
  31.     astackp++;
  32.     *astackp = *(astackp - 1);
  33.  
  34.     mstackp++;
  35.     *mstackp = *(mstackp - 1);
  36.     mident4(mstackp->vm);
  37.  
  38.     /*
  39.      * get list back in right order.
  40.      */
  41.     head = (details *)NULL;
  42.     for (d = stmts; d != (details *)NULL; d = nxtd) {
  43.         nxtd = d->nxt;
  44.         d->nxt = head;
  45.         head = d;
  46.     }
  47.  
  48.     count = eval_iexpr(expr);
  49.     for (i = 0; i != count; i++) {
  50.         for (d = head; d != (details *)NULL; d = d->nxt) {
  51.             switch (d->type) {
  52.             case ART_SCALE:
  53.                 scale(d->u.v.x, d->u.v.y, d->u.v.z);
  54.                 break;
  55.             case ART_TRANSLATE:
  56.                 translate(d->u.v.x, d->u.v.y, d->u.v.z);
  57.                 break;
  58.             case ART_ROTATE:
  59.                 rotate(d->u.rot.ang, d->u.rot.axis);
  60.                 break;
  61.             case OBJECT:
  62.                 if ((ohead = objectinit(d->u.sym, (details *)NULL)) != (object *)NULL) {
  63.                     for (obj = ohead; obj->nxt != (object *)NULL; obj = obj->nxt)
  64.                         ;
  65.  
  66.                     obj->nxt = oblist;
  67.                     oblist = ohead;
  68.                 }
  69.                 break;
  70.             case REPEAT:
  71.                 shead = stail = (details *)NULL;
  72.  
  73.                 for (dl = d->u.rpt.stmt; dl != (details *)NULL; dl = dl->nxt) {
  74.                     newstmnt = (details *)smalloc(sizeof(details));                                    
  75.                     *newstmnt = *dl;
  76.  
  77.                     if (stail == (details *)NULL)
  78.                         shead = stail = newstmnt;
  79.                     else {
  80.                         stail->nxt = newstmnt;
  81.                         stail = newstmnt;
  82.                     }
  83.  
  84.                     stail->nxt = (details *)NULL;
  85.                 }
  86.  
  87.                 nexpr = (expression *)smalloc(sizeof(expression));
  88.                 *nexpr = *d->u.rpt.expr;
  89.  
  90.                 dorepeat(nexpr, shead);
  91.                 break;
  92.             default:
  93.                 fatal("art: bad type in repeat loop.\n");
  94.             }
  95.         }
  96.     }
  97.  
  98.     for (d = head; d != (details *)NULL; d = nxtd) {
  99.         nxtd = d->nxt;
  100.         free(d);
  101.     }
  102.  
  103.     astackp--;
  104.     mstackp--;
  105. }
  106.  
  107.